// 题目描述：
// 中等
// 相关标签
// 相关企业
// 七个不同的符号代表罗马数字，其值如下：

// 符号	值
// I	1
// V	5
// X	10
// L	50
// C	100
// D	500
// M	1000
// 罗马数字是通过添加从最高到最低的小数位值的转换而形成的。将小数位值转换为罗马数字有以下规则：

// 如果该值不是以 4 或 9 开头，请选择可以从输入中减去的最大值的符号，将该符号附加到结果，减去其值，然后将其余部分转换为罗马数字。
// 如果该值以 4 或 9 开头，使用 减法形式，表示从以下符号中减去一个符号，例如 4 是 5 (V) 减 1 (I): IV ，9 是 10 (X) 减 1 (I)：IX。仅使用以下减法形式：4 (IV)，9 (IX)，40 (XL)，90 (XC)，400 (CD) 和 900 (CM)。
// 只有 10 的次方（I, X, C, M）最多可以连续附加 3 次以代表 10 的倍数。你不能多次附加 5 (V)，50 (L) 或 500 (D)。如果需要将符号附加4次，请使用 减法形式。
// 给定一个整数，将其转换为罗马数字。



// 示例 1：

// 输入：num = 3749

// 输出： "MMMDCCXLIX"

// 解释：

// 3000 = MMM 由于 1000 (M) + 1000 (M) + 1000 (M)
//  700 = DCC 由于 500 (D) + 100 (C) + 100 (C)
//   40 = XL 由于 50 (L) 减 10 (X)
//    9 = IX 由于 10 (X) 减 1 (I)
// 注意：49 不是 50 (L) 减 1 (I) 因为转换是基于小数位
// 示例 2：

// 输入：num = 58

// 输出："LVIII"

// 解释：

// 50 = L
//  8 = VIII
// 示例 3：

// 输入：num = 1994

// 输出："MCMXCIV"

// 解释：

// 1000 = M
//  900 = CM
//   90 = XC
//    4 = IV

// 自己的答案（暴力破解法，解出来了，但是逻辑太复杂）：
/**
 * @param {number} num
 * @return {string}
 */
var intToRoman = function (num) {
    // 定义罗马字符及其对应的数值
    const romanValues = {
        1000: "M",
        900: "CM",
        500: "D",
        400: "CD",
        100: "C",
        90: "XC",
        50: "L",
        40: "XL",
        10: "X",
        9: "IX",
        8: "VIII",
        7: "VII",
        6: "VI",
        5: "V",
        4: "IV",
        3: "III",
        2: "II",
        1: "I",
        0: "",
    };
    let result = ''
    let numStr = num.toString()
    for (let i = 0; i < numStr.length; i++) {
        let currentNum = numStr.substring(i)
        if (currentNum[0] === '4' || currentNum[0] === '9') {
            const mult = Math.pow(10, currentNum.length - 1)
            let temp = Math.floor(Number(currentNum) / mult) * mult // 4000
            result += romanValues[Number(temp)]
        } else {
            if (i === numStr.length - 1) { // 个位
                result += romanValues[Number(numStr[i])]
            } else {
                const mult = Math.pow(10, currentNum.length - 1)
                let temp = Math.floor(Number(currentNum) / mult) * mult // 3000
                if (romanValues[temp]) { // 查看是否有匹配项
                    result += romanValues[temp]
                } else {
                    if (Number(currentNum[0]) < 5) { // 查看第一个字符是否比 5 小，小就累加
                        let n = temp / Number(currentNum[0]) // 1000
                        for (let j = 0; j < Number(currentNum[0]); j++) {
                            result += romanValues[n].toString() // M
                        }
                    } else { // 若比 5 大，就用 5 累加 1000
                        let n = temp / Number(currentNum[0]) // 1000
                        result += romanValues[5 * n]
                        for (let j = 0; j < Number(currentNum[0]) - 5; j++) {
                            result += romanValues[n].toString() // M
                        }
                    }
                }
            }
        }
    }
    return result
};

// Gpt答案（主要看这个）：
/**
 * @param {number} num
 * @return {string}
 */
var intToRoman = function (num) {
    // 定义罗马字符及其对应的数值
    const romanValues = [
        { value: 1000, symbol: "M" },
        { value: 900, symbol: "CM" },
        { value: 500, symbol: "D" },
        { value: 400, symbol: "CD" },
        { value: 100, symbol: "C" },
        { value: 90, symbol: "XC" },
        { value: 50, symbol: "L" },
        { value: 40, symbol: "XL" },
        { value: 10, symbol: "X" },
        { value: 9, symbol: "IX" },
        { value: 5, symbol: "V" },
        { value: 4, symbol: "IV" },
        { value: 1, symbol: "I" }
    ];

    let result = '';
    let currentNum = num;

    for (let i = 0; i < romanValues.length; i++) {
        while (currentNum >= romanValues[i].value) {
            result += romanValues[i].symbol;
            currentNum -= romanValues[i].value;
        }
    }

    return result;
};
// 官方题解：
var intToRoman = function(num) {
    const valueSymbols = [[1000, "M"], [900, "CM"], [500, "D"], [400, "CD"], [100, "C"], [90, "XC"], [50, "L"], [40, "XL"], [10, "X"], [9, "IX"], [5, "V"], [4, "IV"], [1, "I"]];
    const roman = [];
    for (const [value, symbol] of valueSymbols) {
        while (num >= value) {
            num -= value;
            roman.push(symbol);
        }
        if (num == 0) {
            break;
        }
    }
    return roman.join('');
};